package com.icehelper.hades.base.controller;

import com.icehelper.hades.base.exception.CommonErrorCode;
import com.icehelper.hades.base.exception.IErrorCode;
import lombok.Data;

/**
 * Http业务返回的统一格式。
 */
@Data
public class BizResponse<T>{

	private int code;
	private String message;
	private String sign;
	private T data;

	public static <T> BizResponse<T> success(){

		return of( CommonErrorCode.SUCCESS, null );
	}

	public static <T> BizResponse<T> fail(){

		return of( CommonErrorCode.SERVER_ERROR, null );
	}

	public static <T> BizResponse<T> fail( CommonErrorCode commonErrorCode ){

		BizResponse<T> res = new BizResponse<>();
		res.setData( null );
		res.setCode( commonErrorCode.code() );
		res.setMessage( commonErrorCode.msg() );
		return res;
	}

	public static <T> BizResponse<T> success( T data ){

		return of( CommonErrorCode.SUCCESS, data );
	}

	public static <T> BizResponse<T> noData( IErrorCode errorCode ){

		return of( errorCode, null );
	}

	public static <T> BizResponse<T> of( IErrorCode errorCode, T data ){

		return of( errorCode.code(), errorCode.msg(), data );
	}

	public static <T> BizResponse<T> of( int errCode, String errMsg, T data ){

		BizResponse<T> res = new BizResponse<>();
		res.setData( data );
		res.setCode( errCode );
		res.setMessage( errMsg );
		return res;
	}

	/**
	 * 指定BizResponse不为空且errorCode为成功。
	 */
	public static boolean isSuccess( BizResponse<?> res ){

		return res != null && IErrorCode.isSuccess( res.getCode() );
	}

	/**
	 * 指定BizResponse不是成功，即 为处理中或者失败。
	 */
	public static boolean isNotSuccess( BizResponse<?> res ){

		return !isSuccess( res );
	}

	/**
	 * 指定BizResponse为空或者errorCode为处理中。
	 */
	public static boolean isProcessing( BizResponse<?> res ){

		return res == null || IErrorCode.isProcessing( res.getCode() );
	}

	/**
	 * 指定BizResponse为空并且errorCode不为成功。
	 */
	public static boolean isFailure( BizResponse<?> res ){

		return res != null && IErrorCode.isFailure( res.getCode() );
	}

	/**
	 * 指定BizResponse不是失败，即 为处理中或者成功。
	 */
	public static boolean isNotFailure( BizResponse<?> res ){

		return !isFailure( res );
	}

	/**
	 * 指定BizResponse不为空且errorCode为成功，而且数据不为空。
	 *
	 * @see BizResponse#isSuccessAndRich(BizResponse)
	 * @deprecated 因为方法名不清晰，不建议使用。建议使用
	 */
	@Deprecated
	public static boolean isSuccessData( BizResponse<?> res ){

		return isSuccessAndRich( res );
	}

	/**
	 * 指定BizResponse不为空且errorCode为成功，而且数据不为空。
	 */
	public static boolean isSuccessAndRich( BizResponse<?> res ){

		return isSuccess( res ) && res.getData() != null;
	}

	/**
	 * 指定BizResponse为空，或者errorCode为失败，或者data为空
	 *
	 * @see BizResponse#isFailOrEmpty(BizResponse)
	 * @deprecated 因为方法名不清晰，不建议使用。建议使用
	 */
	@Deprecated
	public static boolean isFailureData( BizResponse<?> res ){

		return isFailOrEmpty( res );
	}

	/**
	 * 指定BizResponse为空，或者errorCode为失败，或者data为空
	 */
	public static boolean isFailOrEmpty( BizResponse<?> res ){

		return res == null || isFailure( res ) || res.getData() == null;
	}

}
